#include <alt_types.h>
#include "eth_rx.h"
#include "eth_rx_regs.h"




static alt_u32 	base_addr;			//!< Адрес аппаратного модуля.

alt_u8 eth_rx_init(alt_u32 addr)
{
	base_addr = addr;
	return 0;
}


alt_u8 eth_rx_reset()
{
	alt_u8 	err = 0;

	// Команда сброс
	IOWR_ETH_RX_CTRL(base_addr,	1 << ETH_RX_CTRL_CMD_OFST);
	return err;
}



alt_u32 eth_rx_get_size()
{
	eth_rx_status_reg_t	status;
	alt_u8				err 	= 0;
	alt_u32 			size 	= 0;

	// Считываем статус и проверяем, если буфер не пустой, можно считывать размер.
	// При пустом буфере размер останется 0.
	status.data	= IORD_ETH_RX_STATUS(base_addr);
	if (!status.empty)
	{
		size = IORD_ETH_RX_FRAMESZ(base_addr) & ETH_RX_FRAMESZ_SIZE_MSK;
	}

	if (status.full)
	{
		err = 1;
	}

	return size;
}


alt_u32 eth_rx_get_size_next()
{
	eth_rx_status_reg_t	status;
	alt_u32 			size = 0;

	// Считываем статус и проверяем, если буфер не пустой,
	// можно считывать размер и удалить этот пакет.
	// При пустом буфере размер останется 0.
	status.data	= IORD_ETH_RX_STATUS(base_addr);
	if (status.empty)
	{
		size = IORD_ETH_RX_FRAMESZ(base_addr) & ETH_RX_FRAMESZ_SIZE_MSK;

		IOWR_ETH_RX_CTRL(base_addr, 2 << ETH_RX_CTRL_CMD_OFST);
	}

	return size;
}

alt_u32 eth_rx_get_addr()
{
	eth_rx_status_reg_t	status;
	alt_u32 			addr = 0;

	// Считываем статус и проверяем, если буфер не пустой,
	// можно считывать адрес.
	// При пустом буфере адрес устанавливается 0xFFFFFFFF.
	status.data	= IORD_ETH_RX_STATUS(base_addr);
	if (status.empty)
	{
		addr = IORD_ETH_RX_BLOCKADDR(base_addr) & ETH_RX_BLOCKADDR_ADDR_MSK;
	}
	else
	{
		addr = 0xFFFFFFFF;
	}

	return addr;
}

alt_u32 eth_rx_get_addr_next()
{
	eth_rx_status_reg_t	status;
	alt_u32 			addr = 0;

	// Считываем статус и проверяем, если буфер не пустой,
	// можно считывать адрес и удалять пакет.
	// При пустом буфере адрес устанавливается 0xFFFFFFFF.
	status.data	= IORD_ETH_RX_STATUS(base_addr);
	if (!status.empty)
	{
		addr = IORD_ETH_RX_BLOCKADDR(base_addr) & ETH_RX_BLOCKADDR_ADDR_MSK;

		IOWR_ETH_RX_CTRL(base_addr, 2 << ETH_RX_CTRL_CMD_OFST);
	}
	else
	{
		addr = 0xFFFFFFFF;
	}

	return addr;
}
